package com.cskaoyan.encapsulate;

/*
       重点来看数据的保护：
       于是对于私有成员变量的访问，提供了两种方法，专门供外界来访问一个对象的私有成员变量
       public get： 获取某一个成员变量的值
       public set： 修改某一个成员变量的值
       但是, 要注意，一个类中可以定义多个私有成员变量，而每一个成员变量，都对应一个get和set方法，为了表名
       get和set和，它们所针对的那个成员变量的对应关系，有以下命名规则
       成员变量名叫： xxx
       getXxx
       setXxx


        get，set方法带来的好处：
       1. 通过get，set，可以访问对象的私有成员变量值
       2. 通过get，set方法，完成对成员变量访问的读，写分离
       3. 正式因为，外部只能通过get，set方法来访问私有成员变量, 可以以这种方式控制外部，对成员变量值访问


      给对象成员变量赋初值：
   1. 创建对象
      对象名.成员变量1 = 值1
      对象名.成员变量2 = 值2
      ...
      对象名.成员变量n = 值n
      对于私有成员，以上方式，就失效了
      对象名.setXxx(值)

      无参构造 + set方法给对象成员变量值手动赋初值

   2. 利用带参的构造方法




 */
public class Demo1 {

    public static void main(String[] args) {

        // 创建Student对象
        String name = "zs";
        Student zs = new Student(name, 18, 1);

        // 无法在定义name的类体之外，就无法通过对象名.方式访问private
        //System.out.println(zs.name);
//        String name = zs.getName();
//        System.out.println(name);

        // zs 改名字了，改成lisi
        //zs.name = "lisi";

//        zs.setName("lisi");
//        System.out.println(zs.getName());

        zs.setAge(200);
        System.out.println(zs.getAge());


    }

}
class Student {

    private String name;

    private int age;

    private int studentId;

    // 如果将构造方法的访问权限变成private
    // 如果一个类中所有的构造方法都是private访问权限，不能new 该类对象
    public Student (String n, int age, int studentId) {
        this.name = n;
        this.age = age;
        this.studentId = studentId;
    }

    /*
         返回name属性的值
     */
    public String getName() {
        return name;
    }

    /*
        修改name属性的值
     */
    public void setName(String name) {
        this.name = name;
    }

    // alt + insert
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 130 || age < 0) {
            return;
        }
        this.age = age;
    }

    public int getStudentId() {
        return studentId;
    }

    public void setStudentId(int studentId) {
        this.studentId = studentId;
    }
}